# 看看位置编码是如何表征了相对位置的：：
import matplotlib.pyplot as plt
import numpy as np
import torch
# 位置编码函数：
def get_sin_enc_table(n_position, embedding_dim):
    # 位置编码是对每个embedding后的词的每个维度都进行的相对位置的编码：
    # n_position: 输出的序列的最大长度（？len_q）；embedding_dim 词特征维度
    sinusoid_table = np.zeros((n_position, embedding_dim))
    for pos_i in range(n_position):
        for j in range(embedding_dim):
            angle = pos_i/ np.power(10000, 2*(j//2)/embedding_dim)
            sinusoid_table[pos_i,j] = angle
    # 计算sin和cos
    sinusoid_table[:,0::2] = np.sin(sinusoid_table[:,0::2]) # 偶数维度计算sin
    sinusoid_table[:,1::2] = np.cos(sinusoid_table[:,1::2]) # 奇数维度计算cos
    return torch.FloatTensor(sinusoid_table)

n_position = 10
embedding_dim = 32
matrix = get_sin_enc_table(n_position=n_position, embedding_dim=embedding_dim)

# draw
plt.figure(figsize=(5,5))
x = [i for i in range(matrix.size(1))]
y = matrix[0,:]
plt.scatter(x, y, s = 20, alpha=0.5)
x_2 = [i for i in range(matrix.size(0))] 
y_2 = matrix[:,0]
plt.scatter(x_2, y_2, s = 20, alpha=0.5) 
plt.show()

